#include <stdio.h>
#include <unistd.h>
#include "ohos_init.h"
#include "cmsis_os2.h"
#include "iot_gpio.h"
#include "hi_gpio.h"
#include "hi_io.h"
#include "hi_errno.h"

// 1. 宏定义：LED和按键引脚配置（根据硬件接线调整）
#define LED1_TASK_STACK_SIZE 512  // 线程栈大小
#define LED1_TASK_PRIO 25         // 线程优先级
#define LED1_TEST_GPIO 10         // LED1（原LED）对应GPIO10
#define LED2_TEST_GPIO 7          // LED2（新增LED）对应GPIO7
#define TASK_DELAY_TIME 200000    // 200ms防抖延时
#define F1_KEY_GPIO 11            // 按键F1对应GPIO11（控制LED1）
#define F2_KEY_GPIO 12            // 按键F2对应GPIO12（控制LED2）

// 2. 全局变量：LED状态（0=灭，1=亮）
int g_LED1_State = 0;  // LED1初始状态：灭
int g_LED2_State = 0;  // LED2初始状态：灭

// 3. F1按键中断处理函数：控制LED1（按下切换亮/灭）
static void F1_Key_Pressed(char *arg)
{
    (void)arg;
    g_LED1_State = !g_LED1_State;  // 状态翻转（亮→灭/灭→亮）
    IoTGpioSetOutputVal(LED1_TEST_GPIO, g_LED1_State);  // 更新LED1状态
    if (g_LED1_State == 1) {
        printf("F1 Pressed: LED1 ON\r\n");  // 串口提示
    } else {
        printf("F1 Pressed: LED1 OFF\r\n");
    }
    usleep(TASK_DELAY_TIME);  // 软件防抖，避免多次触发
}

// 4. F2按键中断处理函数：控制LED2（按下切换亮/灭）
static void F2_Key_Pressed(char *arg)
{
    (void)arg;
    g_LED2_State = !g_LED2_State;  // 状态翻转
    IoTGpioSetOutputVal(LED2_TEST_GPIO, g_LED2_State);  // 更新LED2状态
    if (g_LED2_State == 1) {
        printf("F2 Pressed: LED2 ON\r\n");  // 串口提示
    } else {
        printf("F2 Pressed: LED2 OFF\r\n");
    }
    usleep(TASK_DELAY_TIME);  // 软件防抖
}

// 5. IO初始化函数：配置LED为输出、按键为输入+中断
static void DualLED_Button_Init(void)
{
    // 5.1 初始化LED1（GPIO10）
    IoTGpioInit(LED1_TEST_GPIO);
    hi_io_set_func(LED1_TEST_GPIO, HI_IO_FUNC_GPIO_10_GPIO);  // 配置为GPIO功能
    IoTGpioSetDir(LED1_TEST_GPIO, IOT_GPIO_DIR_OUT);          // 设置为输出模式
    IoTGpioSetOutputVal(LED1_TEST_GPIO, 0);                   // 初始状态：灭

    // 5.2 初始化LED2（GPIO9，新增）
    IoTGpioInit(LED2_TEST_GPIO);
    hi_io_set_func(LED2_TEST_GPIO, HI_IO_FUNC_GPIO_9_GPIO);   // 配置为GPIO功能
    IoTGpioSetDir(LED2_TEST_GPIO, IOT_GPIO_DIR_OUT);          // 设置为输出模式
    IoTGpioSetOutputVal(LED2_TEST_GPIO, 0);                   // 初始状态：灭

    // 5.3 初始化F1按键（GPIO11）
    hi_gpio_init();
    hi_io_set_pull(F1_KEY_GPIO, HI_IO_PULL_UP);               // 软件上拉（避免引脚浮空）
    hi_io_set_func(F1_KEY_GPIO, HI_IO_FUNC_GPIO_11_GPIO);     // 配置为GPIO功能
    hi_gpio_set_dir(F1_KEY_GPIO, HI_GPIO_DIR_IN);            // 设置为输入模式
    // 注册F1中断：下降沿触发（按键按下时电平从高→低，触发中断）
    hi_gpio_register_isr_function(F1_KEY_GPIO, HI_INT_TYPE_EDGE, 
                                 HI_GPIO_EDGE_FALL_LEVEL_LOW, 
                                 &F1_Key_Pressed, NULL);

    // 5.4 初始化F2按键（GPIO12）
    hi_io_set_pull(F2_KEY_GPIO, HI_IO_PULL_UP);               // 软件上拉
    hi_io_set_func(F2_KEY_GPIO, HI_IO_FUNC_GPIO_12_GPIO);     // 配置为GPIO功能
    hi_gpio_set_dir(F2_KEY_GPIO, HI_GPIO_DIR_IN);            // 设置为输入模式
    // 注册F2中断：下降沿触发
    hi_gpio_register_isr_function(F2_KEY_GPIO, HI_INT_TYPE_EDGE, 
                                 HI_GPIO_EDGE_FALL_LEVEL_LOW, 
                                 &F2_Key_Pressed, NULL);
}

// 6. 线程函数：仅用于初始化（中断已处理LED控制，线程可留空或扩展）
static void *DualLED_Task(const char *arg)
{
    (void)arg;
    while (1) {
        usleep(1000000);  // 1秒休眠，避免占用CPU
    }
    return NULL;
}

// 7. 程序入口：初始化+创建线程
static void DualLED_Example_Entry(void)
{
    osThreadAttr_t attr;
    DualLED_Button_Init();  // 初始化IO和中断

    // 配置线程属性
    attr.name = "DualLED_Task";
    attr.attr_bits = 0U;
    attr.cb_mem = NULL;
    attr.cb_size = 0U;
    attr.stack_mem = NULL;
    attr.stack_size = LED1_TASK_STACK_SIZE;
    attr.priority = LED1_TASK_PRIO;

    // 创建线程（若仅用中断控制，线程可省略，此处保留用于扩展）
    if (osThreadNew((osThreadFunc_t)DualLED_Task, NULL, &attr) == NULL) {
        printf("[DualLED] Failed to create DualLED_Task!\r\n");
    }
}

// 8. 注册鸿蒙系统启动入口
SYS_RUN(DualLED_Example_Entry);